package com.zhu.tool_test.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * @program: tool_test
 * @description: 日期工具类
 * @author: ggBall
 * @create: 2020-12-07 14:54
 **/
public class DateUtils {

    public static final String DEFAULT_FORMAT = "yyyy-MM-dd HH:mm:ss";


    /**
    * @Description 日期转字符串
    * @Author  ggBall
    * @Date   2020/12/7 15:00
    * @Param
     * @param date
     * @param format
    * @Return      java.lang.String
    * @Exception
    *
    */
    public static String parseString(Date date,String format) {

        SimpleDateFormat dateFormat = new SimpleDateFormat(format);

        return dateFormat.format(date);
    }

    /**
     * @Description Long转字符串
     * @Author  ggBall
     * @Date   2020/12/7 15:00
     * @Param
     * @param ts
     * @param format
     * @Return      java.lang.String
     * @Exception
     *
     */
    public static String parseString(Long ts,String format) {

        SimpleDateFormat dateFormat = new SimpleDateFormat(format);
        Date date = new Date(ts);

        return dateFormat.format(date);
    }


    /**
    * @Description long转date
    * @Author  ggBall
    * @Date   2020/12/7 15:27
    * @Param
     * @param ts
    * @Return      java.util.Date
    * @Exception
    *
    */
    public static Date parseDate(Long ts) {
        Date date = new Date(ts);
        return date;
    }

    /**
     * 输出一段时间 按照rule规则
     * @param dBegin 开始时间
     * @param dEnd 结束时间
     * @param rule 规则 例如  Calendar.DAY_OF_MONTH 代表天
     * @return
     */
    public static List<Date> findDates(Date dBegin, Date dEnd,int rule)
    {

        List lDate = new ArrayList();
        lDate.add(dBegin);
        Calendar calBegin = Calendar.getInstance();
        // 使用给定的 Date 设置此 Calendar 的时间
        calBegin.setTime(dBegin);
        Calendar calEnd = Calendar.getInstance();
        // 使用给定的 Date 设置此 Calendar 的时间
        calEnd.setTime(dEnd);
        // 测试此日期是否在指定日期之后
        while (dEnd.after(calBegin.getTime()))
        {
            // 根据日历的规则，为给定的日历字段添加或减去指定的时间量
            calBegin.add(rule, 1);
            lDate.add(calBegin.getTime());
        }
        return lDate;
    }

    /***
     *
     * @Description: 获取的该月的第一天
     * @author: ggBall
     * @date 2021/2/26 16:43
     * @Param month:
     * @return: java.lang.String
     * @since 1.0
     */
    public static String getFirstDayOfMonth(int month) {
        Calendar cal = Calendar.getInstance();
        // 设置月份
        cal.set(Calendar.MONTH, month - 1);
        // 获取某月最小天数
        int firstDay = cal.getActualMinimum(Calendar.DAY_OF_MONTH);
        // 设置日历中月份的最小天数
        cal.set(Calendar.DAY_OF_MONTH, firstDay);
        // 格式化日期
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String firstDayOfMonth = sdf.format(cal.getTime())+" 00:00:00";
        return firstDayOfMonth;
    }
    /**
     * 获得该月最后一天
     *
     * @param month
     * @return
     */
    public static String getLastDayOfMonth(int month) {
        Calendar cal = Calendar.getInstance();
        // 设置月份
        cal.set(Calendar.MONTH, month - 1);
        // 获取某月最大天数
        int lastDay=0;
        //2月的平年瑞年天数
        if(month==2) {
            lastDay = cal.getLeastMaximum(Calendar.DAY_OF_MONTH);
        }else {
            lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
        }
        // 设置日历中月份的最大天数
        cal.set(Calendar.DAY_OF_MONTH, lastDay);
        // 格式化日期
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String lastDayOfMonth = sdf.format(cal.getTime())+" 23:59:59";
        return lastDayOfMonth;
    }

    /***
     *
     * @Description: 获取每个月的最后一天
     * @author: ggBall
     * @date 2021/2/26 16:48
     *
     * @return: java.util.List<java.util.Date>
     * @since 1.0
     */
    public static List<Date> getEveryLastDayOfMonth() {
        Integer times[] = {1,2,3,4,5,6,7,8,9,10,11,12};
        LinkedList<Date> dates = new LinkedList<>();
        for (Integer time : times) {
            String lastDayOfMonth = getLastDayOfMonth(time);
            // 格式化日期
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd DD:HH:SS");
            try {
                Date date = sdf.parse(lastDayOfMonth);
                dates.add(date);
            } catch (ParseException e) {
                e.printStackTrace();
            }
        }

        return dates;

    }



}
